<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>call原理</title>
</head>

<body>

</body>

</html>
<script>
    // call作用：强制改变this指向

    //第二个参数可以是任意数据类型，...arr 扩展运算符
    //把操作函数为第一个参数作为this绑定

    // Function.prototype.call = function (fn, obj, ...arr) {

    //     //首先要判断下this指向，obj如果为null 和 undefined怎么处理

    //     if (obj === null || obj === undefined) {
    //         obj = obj || window
    //     }

    //     //obj添加一个新方法 ,赋值 ，值必须是当前调用addStr函数的对象
    //     obj.Fms = fn;

    //     //这里可以使用obj方法，吧参数放入方法中，创建个变量接受
    //     let result = obj.Fms(...arr);

    //     //删除添加的方法
    //     delete obj.Fms;

    //     //最后把接受数据的变量返回
    //     return result;

    // }


    //接收参数的方式不同
    //call与apply都属于Function.prototype的一个方法

    // function add(c, d) {
    //     return this.a + this.b + c + d;
    // }
    // var o = { a: 1, b: 3 };
    // add.call(o, 5, 7); // 1 + 3 + 5 + 7 = 16 
    // add.apply(o, [10, 20]); // 1 + 3 + 10 + 20 = 34 


    // if (arr !== undefined) {
    //     obj[key] = value;
    // }


</script>